/**
 *  Copyright 2016年12月12日 北京福富软件技术股份有限公司
 *  All Rights Reserved.
 *  文件名称: QuestionController  
 *  初始作者：g.huangshg
 *  初始版本：V1.0.0   
 *  完成日期： 2016年12月12日 
 */
package sys.controller;

import com.init.ConfigInitial;
import com.init.SingletonCache;
import com.util.CommonUtil;
import com.util.LogUtil;
import com.util.PagedRequest;
import com.util.PagedResult;
import com.alibaba.fastjson.JSON;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import sys.model.AnserKey;
import sys.model.QuestionAnser;
import sys.model.Questionnaire;
import sys.model.User;
import sys.service.QuestionnaireService;
import sys.util.UserUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.*;

/********************************************************
 * 类名：QuestionController
 * 功能：
 * 作者：g.huangshg 2016年12月12日
 * 修改记录：
 *      日期              修改人              修改说明
 ********************************************************/
@Controller
@RequestMapping("/Question")
public class QuestionController {
    @Autowired
    private QuestionnaireService qService;

    /*********************************************************
     * 函数名: add
     * 功能     : 创建问卷
     * 作者      ：g.huangshg 2017-2-07
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param questionnaire
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/add", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String add(HttpServletRequest request, HttpServletResponse response, String questionnaire) throws Exception  {
        JSONObject configuration = new JSONObject(questionnaire);
        JSONObject json = new JSONObject();
        Questionnaire q = JSON.parseObject(configuration.toString(),Questionnaire.class);
        String oprate="创建问卷";
        if(q.getId()!=null) {
            LogUtil.info("修改问卷====>");
            oprate="修改问卷";
        }
        else {
            LogUtil.info("创建问卷====>");
            HttpSession session = request.getSession();
            Object user= session.getAttribute("user");
            if(user!=null&&user.getClass()==User.class)
                q.setUserid(((User)user).getId());
            else
                q.setUserid(0);
            q.setCtime(new Date());
            q.setStart(true);  //启用true   不启用false
            q.setMailstart(false);
            q.setPagestart(true);
            q.setWechatstart(true);
        }
     //   System.out.println(q);
        json.put("oprate",oprate);
        if(qService.add(q)>0){
            json.put("flag","success");
            json.put("oprated","成功");
            json.put("msg","请尽快完成推送配置");
            List<Questionnaire> list;
            try {

                list = (List<Questionnaire>) SingletonCache.getCacheElement(ConfigInitial.QuestionnareList, SingletonCache.getCache(ConfigInitial.Init));
                if(list!=null&&!list.isEmpty()){
                    if(oprate.equals("创建问卷")){
                        q.setQuestions(null);
                        list.add(q);
                    }
                    else {
                        for (Questionnaire qq : list) {
                            if (qq.getId() == q.getId()) {
                                list.remove(qq);
                                q.setQuestions(null);
                                list.add(q);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception e){
                LogUtil.info("重建问卷缓存====>");
                list=new ArrayList<>();
            }
        }
        else {
            json.put("flag","error");
            json.put("oprated","失败");
            json.put("msg","问卷标题存在,换一个标题");

        }
        return json.toString();
    }
/*********************************************************
 * 函数名: getQuestionnaire
 * 功能     : 获取整张的问卷对象
 * 作者      ：g.huangshg 2017-2-07
 * 参数表: @param response
 * 参数表: @param request
 * 参数表: @param questionnaire
 * 参数表: @throws Exception
 * 返回值: String
 * 修改记录：
 *          日期                 修改人                 修改说明
 ********************************************************/
@RequestMapping(value = "/getQuestionnaire", method = { RequestMethod.POST,
        RequestMethod.GET },produces = "text/plain;charset=UTF-8")
public String getQuestionnaire(Model model,HttpServletRequest request, HttpServletResponse response, String id) throws Exception  {
    LogUtil.info("问卷详情预览====> id="+id);
    JSONObject json = new JSONObject();
    if(id==""||id==null)  id="0";
    Questionnaire a=qService.selectByPrimaryKey(Integer.parseInt(id));
    model.addAttribute("Questionnaire", JSON.toJSONString(a));
    System.out.println(JSON.toJSONString(a));
    return "jsp/monitor/questionshow2";
}

    /*********************************************************
     * 函数名: updateQuestionnaire
     * 功能     : 修改问卷
     * 作者      ：g.huangshg 2017-2-07
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param questionnaire
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/updateQuestionnaire", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")

    public String updateQuestionnaire(Model model,HttpServletRequest request, HttpServletResponse response, String id) throws Exception  {
        if(id!=null) {
            LogUtil.info("问卷修改页面====> id=" + id);
            JSONObject json = new JSONObject();
            Questionnaire a = qService.selectByPrimaryKey(Integer.parseInt(id));
            model.addAttribute("Questionnaire", JSON.toJSONString(a));
        }
        else {
            LogUtil.info("问卷新建页面====>");
        }
        return "jsp/config/questiondesign";
    }

    /*********************************************************
     * 函数名: updateQuestionnaire
     * 功能     : 修改问卷
     * 作者      ：g.huangshg 2017-2-07
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param questionnaire
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/deleteQuestionnaire", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String deleteQuestionnaire(String id) throws Exception  {
        LogUtil.info("删除问卷====> id="+id);
        JSONObject json = new JSONObject();
        int i=qService.delete(Integer.parseInt(id));
        if(i>0)
        {
            json.put("flag","success");
            json.put("msg","删除成功");
            List<Questionnaire> list;
            try {

                list = (List<Questionnaire>) SingletonCache.getCacheElement(ConfigInitial.QuestionnareList, SingletonCache.getCache(ConfigInitial.Init));
                if(list!=null&&!list.isEmpty()){
                    for (Questionnaire qq: list) {
                        if(qq.getId()==Integer.parseInt(id)){
                           list.remove(qq);
                            break;
                        }
                    }
                }
            }
            catch (Exception e){
                LogUtil.info("重建问卷缓存====>");
                list=new ArrayList<>();
            }

        }
        else {json.put("flag","false");
            json.put("msg","删除失败");

        }
        return json.toString();
    }
    /*********************************************************
     * 函数名: getQuestionnaireView
     * 功能     : 获取问卷列表
     * 作者      ：g.huangshg 2017-2-07
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param pagedRequest
     * 参数表: @param title
     * 参数表: @param start
     * 参数表: @param end
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/getQuestionnaireView", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String getQuestionnaireView(HttpServletRequest request, HttpServletResponse response, PagedRequest pagedRequest, String title, String start, String end) throws Exception  {
        LogUtil.info("问卷列表查询====>");
        LogUtil.info("分页参数:"+	pagedRequest.getPage());
        LogUtil.info("分页页数:"+	pagedRequest.getRows());
        LogUtil.info("排序序名:"+	pagedRequest.getSidx());
        LogUtil.info("排序方式:"+	pagedRequest.getSord());
        LogUtil.info("问卷标题:"+	title);
        LogUtil.info("创建时间:"+	start+" ~ "+end);
        Map map =new HashMap<String,String>();
        User user= UserUtil.getUser(request);
        if(user!=null){
            map.put("userid",user.getId());
        }
        map.put("page",pagedRequest.getPage());
        map.put("rows",pagedRequest.getRows());
        map.put("sidx",pagedRequest.getSidx());
        map.put("sord",pagedRequest.getSord());
        map.put("title",title);
        map.put("start",start);
        map.put("end",end);
        PagedResult<Questionnaire> r_list = qService.selectView(map);
        System.out.println(JSON.toJSONString(r_list));
        return JSON.toJSONString(r_list);
    }


    /*********************************************************
     * 函数名: getQuestionnaireByCache
     * 功能     : 获取问卷列表
     * 作者      ：g.huangshg 2017-2-07
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param pagedRequest
     * 参数表: @param title
     * 参数表: @param start
     * 参数表: @param end
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/getQuestionnaireByCache", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String getQuestionnaireByCache(HttpServletRequest request, HttpServletResponse response, PagedRequest pagedRequest, String title, String start, String end,String type) throws Exception  {
        LogUtil.info("获取问卷列表====>");
        Map map =new HashMap<>();
        List<Questionnaire> list;
        try {
            list = (List<Questionnaire>) SingletonCache.getCacheElement(ConfigInitial.QuestionnareList, SingletonCache.getCache(ConfigInitial.Init));
            if(list==null||list.isEmpty())
             list = qService.selectTitleList();

        }
        catch (Exception e){
            LogUtil.info("问卷缓存出错,重新赋值");
            list = qService.selectTitleList();
        }
        if(list==null) list=new ArrayList<>();
        SingletonCache.addToCache(ConfigInitial.QuestionnareList,list,SingletonCache.getCache(ConfigInitial.Init));
        List<Questionnaire> list2=new ArrayList<>();
        if(type!=null&&type.equals("page")){
             list2=new ArrayList<>();
            for (Questionnaire q : list) {
                if(q.getStart()&&q.isPagestart()){
                    list2.add(q);
                }
            }
        }
        else{
            list2=list;
        }
     //   System.out.println(JSON.toJSONString(list));
        return JSON.toJSONString(list2);
    }



    /*********************************************************
     * 函数名: getQuestionnaireView
     * 功能     : 获取问卷列表  用于构建select
     * 作者      ：g.huangshg 2017-2-07
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param pagedRequest
     * 参数表: @param title
     * 参数表: @param start
     * 参数表: @param end
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/getQuestionnaireList", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String getQuestionnaireList(HttpServletRequest request) throws Exception  {
        Map map =new HashMap<String,String>();
        User user= UserUtil.getUser(request);
        if(user!=null){
            map.put("userid",user.getId());
        }
        List<Map> list=qService.selectList(map);

        return JSON.toJSONString(list);
    }


    /*********************************************************
     * 函数名: returnAnser
     * 功能     : 问卷答案提交
     * 作者      ：g.huangshg 2017-2-17
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param anserkey     对象转化的json串
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/returnAnser", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String returnAnser(HttpServletRequest request, HttpServletResponse response, String anserkey) throws Exception  {
        LogUtil.info("问卷答案提交====>");
        JSONObject configuration = new JSONObject(anserkey);
        JSONObject json = new JSONObject();
        AnserKey key = JSON.parseObject(configuration.toString(),AnserKey.class);
        key.setUseragent(CommonUtil.getAgent(request.getHeader("user-agent")));
        key.setUsername("");
        key.setCtime(new Date());
        System.out.println(key);
        int i=qService.inserAnserKey(key);
        if(i>0) {
            json.put("state", "success");
            json.put("opera", "提交成功!");
            json.put("msg", "感谢您的支持");
        }
        else {
            json.put("state", "false");
            json.put("opera", "提交失败!");
            json.put("msg", "请检查是否非法字符,或联系管理员");
        }
        return json.toString();
    }


    /*********************************************************
     * 函数名: returnAnser
     * 功能     : 问卷答案提交
     * 作者      ：g.huangshg 2017-2-17
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param anserkey     对象转化的json串
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/getAnserView", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String getAnserView(HttpServletRequest request, HttpServletResponse response, PagedRequest pagedRequest, String qid, String start, String end) throws Exception  {
        LogUtil.info("问卷结果列表====>");
        LogUtil.info("分页参数:"+	pagedRequest.getPage());
        LogUtil.info("分页页数:"+	pagedRequest.getRows());
        LogUtil.info("排序序名:"+	pagedRequest.getSidx());
        LogUtil.info("排序方式:"+	pagedRequest.getSord());
        LogUtil.info("问卷ID:"+	qid);
        LogUtil.info("填写时间:"+	start+" ~ "+end);
        Map map =new HashMap<String,String>();
        map.put("page",pagedRequest.getPage());
        map.put("rows",pagedRequest.getRows());
        map.put("sidx",pagedRequest.getSidx());
        map.put("sord",pagedRequest.getSord());
        map.put("qid",qid);
        map.put("start",start);
        map.put("end",end);
        PagedResult<AnserKey> r_list = qService.selectAnserKeyView(map);
        System.out.println(JSON.toJSONString(r_list));
        return JSON.toJSONString(r_list);
    }


    /*********************************************************
     * 函数名: returnAnser
     * 功能     : 问卷答案
     * 作者      ：g.huangshg 2017-2-17
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param anserkey     对象转化的json串
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/getAnser", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    public String getAnser(Model model,HttpServletRequest request, HttpServletResponse response, String id) throws Exception  {
        LogUtil.info("问卷结果(回填)====>");
        if(id==null||id.equals(""))  id="0";
        LogUtil.info("anserKeyID:"+	id);
        int ID=Integer.parseInt(id);
        AnserKey ak = qService.selectAnserKeyByID(ID);
        model.addAttribute("AnserKey", JSON.toJSONString(ak));
        if(ak!=null){
            Questionnaire q = qService.selectByPrimaryKey(ak.getQid());
            model.addAttribute("Questionnaire", JSON.toJSONString(q));
        }
        return "jsp/monitor/questionshow2";
    }

    /*********************************************************
     * 函数名: returnAnser
     * 功能     : 问卷答案
     * 作者      ：g.huangshg 2017-2-17
     * 参数表: @param response
     * 参数表: @param request
     * 参数表: @param anserkey     对象转化的json串
     * 参数表: @throws Exception
     * 返回值: String
     * 修改记录：
     *          日期                 修改人                 修改说明
     ********************************************************/
    @RequestMapping(value = "/getAnserBar", method = { RequestMethod.POST,
            RequestMethod.GET },produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String getAnserBar( String qorder,String qid) throws Exception  {
        LogUtil.info("问卷结果柱形图数据====>");
        Map map =new HashMap<String,String>();
        map.put("qid",qid);
        map.put("qorder",qorder);
        QuestionAnser qa = qService.getAnserBar(map);
        System.out.println(JSON.toJSONString(qa));
        return JSON.toJSONString(qa);
    }



}
